﻿//------------------------------------------------------------------------------
// ╭─────────────────────────────╮
// │ ╭─╮     ╭─╮              TM │   ╠═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╣
// │ │ │     │ │                 │                                           ☺  
// │ │ ╰───╮ │ │ ╭─────╮ ╭─────╮ │     Name:Wedn.Net 程序集操作助手类      ♮ ♪ ♩
// │ │ ╭─╮ │ │ │ │ ╭─╮ │ │ ╭─╮ │ │                                     ♫ ♭      
// │ │ ╰─╯ │ │ │ │ ╰─╯ │ │ ╰─╯ │ │     Author:iceStone                ♬ ♪       
// │ └─────╯ └─╯ ╰─────╯ ╰───╮ │ │     Chinese:汪磊                              
// │                     ┌───╯ │ │                                              
// │                     ╰─────╯ │   ╠═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╣
// ╰─────────────────────────────╯                                              
//------------------------------------------------------------------------------
using System.Reflection;

namespace Wedn.Net.Utility
{
    /// <summary>
    /// 程序集操作助手类
    /// </summary>
    public static class AssemblyHelpler
    {
        #region 反射获取指定程序集的指定类型实例, 如果存在则返回对象, 不存在则返回null; +static void CreateInstance<T>(string lockStr, string assemblyString, string typeName, ref T instance) where T : class
        /// <summary>
        /// 反射获取指定程序集的指定类型实例, 如果存在则返回对象, 不存在则返回null;
        /// </summary>
        /// <param name="instance">实例变量</param>
        /// <param name="lockStr">LockVariable</param>
        /// <param name="assemblyString">程序集名称的长格式</param>
        /// <param name="typeName">类型完整名称</param>
        public static void CreateInstance<T>(string lockStr, string assemblyString, string typeName, ref T instance) where T : class
        {
            //instance = XmlHelper.XmlDeserializeFromFile<T>(string.Format("~/Content/Data/{0}.xml", typeName));
            //if (instance == null)
            //{
            lock (lockStr)
            {
                if (instance == null)
                {
                    try
                    {
                        instance = Assembly.Load(assemblyString).CreateInstance(typeName) as T;
                    }
                    catch 
                    {
                        throw new System.Exception(string.Format("{0}不存在，或者{1}不存在，无法得到对象！", assemblyString, typeName));
                    }
                    //XmlHelper.XmlSerializeToFile(instance, string.Format("~/Content/Data/{0}.xml", typeName));
                }
            }
            //}
        }
        #endregion

        #region 反射获取指定程序集的指定类型实例, 如果存在则返回对象, 不存在则返回null; +static T CreateInstance<T>(string lockStr, string assemblyString, string typeName) where T : class
        /// <summary>
        /// 反射获取指定程序集的指定类型实例, 如果存在则返回对象, 不存在则返回null;
        /// </summary>
        /// <param name="lockStr">LockVariable</param>
        /// <param name="assemblyString">程序集名称的长格式</param>
        /// <param name="typeName">类型完整名称</param>
        /// <returns>泛型对象</returns>
        public static T CreateInstance<T>(string lockStr, string assemblyString, string typeName) where T : class
        {
            //XmlHelper.XmlDeserializeFromFile<T>(string.Format("~/Content/Data/{0}.xml", typeName));
            lock (lockStr)
            {
                try
                {
                    T instance = Assembly.Load(assemblyString).CreateInstance(typeName) as T;
                    return instance;
                }
                catch 
                {
                    throw new System.Exception(string.Format("{0}不存在，或者{1}不存在，无法得到对象！", assemblyString, typeName));
                }
                //XmlHelper.XmlSerializeToFile(instance, string.Format("~/Content/Data/{0}.xml", typeName));
            }
        }
        #endregion
    }
}
